package com.whcoding.mybatis.controller;

import com.whcoding.mybatis.pojo.OrmDeptVO;
import com.whcoding.mybatis.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @program: spring-boot-learning
 * @description:
 * @author: whcoding
 * @create: 2022-02-17 17:23
 **/
@RestController
public class DeptRESTfulController {


	@Autowired
	private DeptService deptService;

	/**
	 *
	 * https://blog.csdn.net/wj123446/article/details/80058856
	 *
	 * RESTful Web 测试风格
	 * 1.@RestController= @Controller +@ResponseBody  将返回的对象数据直接以 JSON 或 XML 形式写入 HTTP 响应(Response)中
	 * 2.@PostMapping实际上就等价于 @RequestMapping(method = RequestMethod.POST)
	 * 3.@RequestMapping默认映射所有HTTP Action**，你可以使用@RequestMapping(method=ActionType)来缩小这个映射。
	 * 4.@PathVariable :取url地址中的参数。@RequestParam  url的查询参数值。
	 * 5.@RequestBody:可以将 HttpRequest body 中的 JSON 类型数据反序列化为合适的 Java 类型
	 * 6.ResponseEntity: 表示整个HTTP Response：状态码，标头和正文内容。我们可以使用它来自定义HTTP Response 的内容
	 */

	/**
	 * 1.获取单个对象的方法用 get 做前缀。
	 * 2.获取多个对象的方法用 list 做前缀，复数形式结尾如：listObjects。
	 * 3.获取统计值的方法用 count 做前缀。
	 * 4.插入的方法用save/insert 做前缀。
	 * 5.删除的方法用remove/delete 做前缀。
	 * 6.修改的方法用update 做前缀。
	 */

	/**
	 * 查询数据-list
	 *
	 * @return
	 */
	@GetMapping("/dept")
	public ResponseEntity<List<OrmDeptVO>> listDept() {
		return ResponseEntity.ok(deptService.queryAllDept());
	}

	/**
	 * 查询数据-单条
	 *
	 * @param deptId
	 * @return
	 */
	@GetMapping("/dept/getDeptByDeptId/{deptId}")
	public ResponseEntity getDeptByDeptId(@PathVariable("deptId") @Valid Long deptId) {
		return ResponseEntity.ok(deptService.queryDeptById(deptId));
	}


	/**
	 * 查询数据-单条
	 *
	 * @param deptName
	 * @return
	 */
	@GetMapping("/dept/{deptName}")
	public ResponseEntity getDeptByDeptName(@PathVariable("deptName") String deptName) {
		List<OrmDeptVO> results = deptService.queryAllDept().stream().filter(cp -> cp.getDeptName().equals(deptName)).collect(Collectors.toList());
		return ResponseEntity.ok(results);
	}

	/**
	 * 删除数据
	 *
	 * @param id
	 * @return
	 */
	@DeleteMapping("/dept/deleteDeptById/{id}")
	public ResponseEntity deleteDeptById(@PathVariable("id") @Valid Long id) {
		return ResponseEntity.ok(deptService.deleteDeptByID(id));
	}


	/**
	 * 新增数据
	 *
	 * @param deptVO
	 * @return
	 */
	@PostMapping("/dept")
	public ResponseEntity saveDept(@RequestBody OrmDeptVO deptVO) {
		boolean isSave = deptService.addDept(deptVO);
		return ResponseEntity.ok(isSave);
	}


	/**
	 * 更新数据
	 *
	 * @param deptVO
	 * @return
	 */
	@PutMapping("/dept")
	public ResponseEntity updateDept(@RequestBody OrmDeptVO deptVO) {
		return ResponseEntity.ok(deptService.updateDept(deptVO));
	}

	/**
	 * 查询 count
	 *
	 * @param
	 * @return
	 */
	@GetMapping("/dept/countByDept")
	public ResponseEntity countByDept() {
		return ResponseEntity.ok(deptService.countByDept());
	}

	/**
	 * 验证参数的有效性
	 *
	 * @param deptVO
	 * @return
	 */
	@PostMapping("/dept/getDeptValid")
	public ResponseEntity<OrmDeptVO> getDeptValid(@RequestBody @Valid OrmDeptVO deptVO) {
		return ResponseEntity.ok().body(deptVO);
	}

	/**
	 * 事务更新数据
	 * @return
	 */
	@PostMapping("/dept/updateByTransactionalDemo")
	public ResponseEntity updateByTransactionalDemo() {
		deptService.updateByTransactionalDemo();
		return ResponseEntity.ok(true);
	}

	/**
	 * 批量新增
	 * @return
	 */
	@PostMapping("/dept/batchInsertOneSql")
	public ResponseEntity batchInsertOneSql() {
		deptService.batchInsertOneSql(deptService.queryAllDept());
		return ResponseEntity.ok(true);
	}

	/**
	 * 批量新增
	 * @return
	 */
	@PostMapping("/dept/batchInsert")
	public ResponseEntity batchInsert() {
		deptService.batchInsert(deptService.queryAllDept());
		return ResponseEntity.ok(true);
	}

	/**
	 * 测试deptAll
	 * @return
	 */
	@GetMapping("/dept/deptTestAll")
	public ResponseEntity deptTestAll() {
		deptService.deptTestAll();
		return ResponseEntity.ok(true);
	}

}
